﻿Imports DTO
Imports System.Data.SqlClient

Public Class ProdutoDAL

#Region "Métodos"
    ''' <summary>
    ''' Método responsável incluir um produto na base de dados
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Incluir(produto As ProdutoDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_INSERIR_PRODUTO " & _
                     " @Nome, @Quantidade, @ValorCusto, @ValorVenda," & _
                     " @Fornecedor, @TipoProduto, @Descricao"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Fornecedor", SqlDbType.VarChar, 50).Value = produto.pFornecedor
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 100).Value = produto.pNome
                    cmd.Parameters.Add("@Quantidade", SqlDbType.Decimal).Value = produto.pQuantidade
                    cmd.Parameters.Add("@TipoProduto", SqlDbType.VarChar, 50).Value = produto.pTipo
                    cmd.Parameters.Add("@ValorCusto", SqlDbType.Decimal).Value = produto.pValorCusto
                    cmd.Parameters.Add("@ValorVenda", SqlDbType.Decimal).Value = produto.pValorVenda
                    cmd.Parameters.Add("@Descricao", SqlDbType.VarChar, 200).Value = produto.pDescricao

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As SqlException
                    'Erro nº 2627 do SQLException indica chave primaria duplicada
                    If ex.Number = 2627 Then
                        Throw New Exception("Já existe um produto com este código cadastrado!")
                    Else
                        Throw ex
                    End If
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para alterar um determinado produto através de seu código
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Alterar(produto As ProdutoDTO)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_ALTERAR_PRODUTO " & _
                     " @Nome, @Quantidade, @ValorCusto, @ValorVenda," & _
                     " @Fornecedor, @TipoProduto, @Descricao"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = produto.pCodigo
                    cmd.Parameters.Add("@Fornecedor", SqlDbType.VarChar, 50).Value = produto.pFornecedor
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 100).Value = produto.pNome
                    cmd.Parameters.Add("@Quantidade", SqlDbType.Decimal).Value = produto.pQuantidade
                    cmd.Parameters.Add("@TipoProduto", SqlDbType.Int).Value = produto.pTipo
                    cmd.Parameters.Add("@ValorUnitario", SqlDbType.Decimal).Value = produto.pValorCusto
                    cmd.Parameters.Add("@ValorTotal", SqlDbType.Decimal).Value = produto.pValorVenda
                    cmd.Parameters.Add("@Descricao", SqlDbType.VarChar, 200).Value = produto.pDescricao

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método utilizado para excluir o produto passando como parâmetro o código
    ''' </summary>
    ''' <param name="codigo"></param>
    ''' <remarks></remarks>
    Public Sub Excluir(codigo As Integer)
        Dim strSql As String
        Using conn As New SqlConnection(My.Settings.Conexao)

            'Cria a string de execução da procedure
            strSql = "EXEC PR_EXCLUIR_PRODUTO " & _
                     " @Codigo"

            Using cmd As New SqlCommand(strSql, conn)
                Try
                    'Cria os parâmetros de execução
                    cmd.Parameters.Add("@Codigo", SqlDbType.Int).Value = codigo

                    conn.Open() 'Abrir a conexao
                    cmd.ExecuteNonQuery() 'Executa o SQL

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Sub

    ''' <summary>
    ''' Método responsável por listar produtos ativos
    ''' </summary>
    ''' <param name="Nome"></param>
    ''' <remarks></remarks>
    Public Function Consultar(Nome As String) As ProdutoDTO
        Dim reader As SqlDataReader
        Dim strSql As String
        Dim objProduto As New ProdutoDTO
        Try
            Using conn As New SqlConnection(My.Settings.Conexao)
                strSql = "SELECT TOP(1)* FROM TB_Produto WHERE Nome like '@Nome%' AND Ativo=1"
                Using cmd As New SqlCommand(strSql, conn)
                    cmd.Parameters.Add("@Nome", SqlDbType.VarChar, 50).Value = Nome

                    conn.Open()
                    reader = cmd.ExecuteReader

                    'Se ele encontrou algum registro, preenche o objeto
                    If reader.Read() Then
                        objProduto.pCodigo = reader.Item("Codigo")
                        objProduto.pFornecedor = reader.Item("Fornecedor")
                        objProduto.pNome = reader.Item("Nome")
                        objProduto.pQuantidade = reader.Item("Quantidade")
                        objProduto.pTipo = reader.Item("TipoProduto")
                        objProduto.pValorCusto = reader.Item("ValorCusto")
                        objProduto.pValorVenda = reader.Item("ValorVenda")
                        objProduto.pDescricao = reader.Item("Descricao")

                        Return objProduto
                    End If
                    reader.Close()


                End Using
            End Using
        Catch ex As Exception
            Throw ex
        End Try
        objProduto = Nothing
        Return objProduto
    End Function

    ''' <summary>
    ''' Método responsável por listar todos os produtos existentes e ativos
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ConsultarPorCategoria(categoria As String) As List(Of ProdutoDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim objProduto As ProdutoDTO
        Dim listaProduto As New List(Of ProdutoDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM TB_Produto WHERE TipoProduto=@TipoProduto AND Ativo=1"
            Using cmd As New SqlCommand(strSQL, conn)
                cmd.Parameters.Add("@TipoProduto", SqlDbType.VarChar, 50).Value = categoria


                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        objProduto = New ProdutoDTO

                        With objProduto
                            .pCodigo = reader.Item("Codigo")
                            .pFornecedor = reader.Item("Fornecedor")
                            .pNome = reader.Item("Nome")
                            .pQuantidade = reader.Item("Quantidade")
                            .pTipo = reader.Item("TipoProduto")
                            .pValorCusto = reader.Item("ValorCusto")
                            .pValorVenda = reader.Item("ValorVenda")
                            .pDescricao = reader.Item("Descricao")
                        End With

                        'adicionar na lista
                        listaProduto.Add(objProduto)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaProduto

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using

        listaProduto = Nothing
        Return listaProduto
    End Function

    ''' <summary>
    ''' Método responsável por listar todos os produtos existentes e ativos
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Listar() As List(Of ProdutoDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim objProduto As ProdutoDTO
        Dim listaProduto As New List(Of ProdutoDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM TB_Produto WHERE Ativo=1"

            Using cmd As New SqlCommand(strSQL, conn)
                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        objProduto = New ProdutoDTO

                        With objProduto
                            .pCodigo = reader.Item("Codigo")
                            .pFornecedor = reader.Item("Fornecedor")
                            .pNome = reader.Item("Nome")
                            .pQuantidade = reader.Item("Quantidade")
                            .pTipo = reader.Item("TipoProduto")
                            .pValorCusto = reader.Item("ValorCusto")
                            .pValorVenda = reader.Item("ValorVenda")
                            .pDescricao = reader.Item("Descricao")
                        End With

                        'adicionar na lista
                        listaProduto.Add(objProduto)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaProduto

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function

    ''' <summary>
    ''' Método responsável por listar produtos ativos
    ''' </summary>
    ''' <param name="codigo"></param>
    ''' <remarks></remarks>
    Public Function ConsultarPorCodigo(codigo As Integer) As List(Of ProdutoDTO)
        Dim strSQL As String
        Dim reader As SqlDataReader
        Dim objProduto As ProdutoDTO
        Dim listaProduto As New List(Of ProdutoDTO)


        Using conn As New SqlConnection(My.Settings.Conexao)
            'conn.ConnectionString = My.Settings.StringConexao
            strSQL = "SELECT * FROM TB_Produto WHERE Codigo=@Codigo AND Ativo=1"

            Using cmd As New SqlCommand(strSQL, conn)
                cmd.Parameters.Add("@Codigo", SqlDbType.VarChar, 50).Value = codigo
                Try
                    'Cria parâmetro

                    conn.Open() 'Abre conexão

                    reader = cmd.ExecuteReader

                    Do While reader.Read
                        'Instacia um novo objeto clsCliente e preenche este obj com info do bd
                        objProduto = New ProdutoDTO

                        With objProduto
                            .pCodigo = reader.Item("Codigo")
                            .pFornecedor = reader.Item("Fornecedor")
                            .pNome = reader.Item("Nome")
                            .pQuantidade = reader.Item("Quantidade")
                            .pTipo = reader.Item("TipoProduto")
                            .pValorCusto = reader.Item("ValorCusto")
                            .pValorVenda = reader.Item("ValorVenda")
                            .pDescricao = reader.Item("Descricao")
                        End With

                        'adicionar na lista
                        listaProduto.Add(objProduto)

                    Loop
                    'fecha o cursos
                    reader.Close()

                    Return listaProduto

                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Using
    End Function
#End Region


End Class
